import Vue from 'vue'
import Router from '@/router/index'
let vm = new Vue();

// 配置API接口地址
var baseURL = { api1: 'http://127.0.0.1:5002/api/', id4: 'http://127.0.0.1:5002/', client:'http://127.0.0.1:8001/' }
// var baseURL = { api1: 'http://weiyong.vaiwan.com/api/', id4: 'http://weiyong.vaiwan.com/' ,client:'http://weiyong.vaiwan.com/'}
// 引用axios
var axios = require('axios')
// 请求拦截器
axios.interceptors.request.use(
    config => {
        // 每次发送请求之前判断vuex中是否存在token
        // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
        // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
        const access_token = window.localStorage.getItem("access_token");
        access_token && (config.headers.Authorization = access_token);
        return config;
    },
    error => {
        vm.$dialog.alert({
            message: JSON.stringify(error),
        })
        return Promise.error(error);
    }
);
// 响应拦截器
axios.interceptors.response.use(
    response => {
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误
        return Promise.resolve(response);
    },
    // 服务器状态码不是2开头的的情况
    // 这里可以跟你们的后台开发人员协商好统一的错误状态码
    // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
    // 下面列举几个常见的操作，其他需求可自行扩展
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                // 401: 未登录
                // 未登录则跳转登录页面，并携带当前页面的路径
                // 在登录成功后返回当前页面，这一步需要在登录页操作。
                case 401:
                    window.localStorage.setItem("access_token", null);
                    vm.$notify({ type: 'danger', message: '身份验证失败，请重新登录。' });
                    Router.push({ path: '/login' })
                    break;
                // 403 token过期
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页面
                case 403:
                    // vm.$notify({ type: 'danger', message: error.response.data.error.message });
                    // 清除token
                    window.localStorage.setItem("access_token", null);
                    break;
                // 404请求不存在
                case 404:
                    vm.$notify({ type: 'danger', message: '您访问的资源不存在。' });
                    break;
                // 其他错误，直接抛出错误提示
                default:
                    vm.$dialog.alert({
                        message: JSON.stringify(error),
                    })
                // vm.$notify({ type: 'danger', message: error.response.data.error_description });
            }
            return Promise.reject(error.response);
        } else {
            vm.$dialog.alert({
                message: JSON.stringify(error),
            })
        }
    }
);


// 自定义判断元素类型JS
function toType(obj) {
    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
// 参数过滤函数
function filterNull(o) {
    for (var key in o) {
        if (o[key] === null) {
            delete o[key]
        }
        if (toType(o[key]) === 'string') {
            o[key] = o[key].trim()
        } else if (toType(o[key]) === 'object') {
            o[key] = filterNull(o[key])
        } else if (toType(o[key]) === 'array') {
            o[key] = filterNull(o[key])
        }
    }
    return o
}
/*
  接口处理函数
  这个函数每个项目都是不一样的，我现在调整的是适用于
  https://cnodejs.org/api/v1 的接口，如果是其他接口
  需要根据接口的参数进行调整。参考说明文档地址：
  https://cnodejs.org/topic/5378720ed6e2d16149fa16bd
  主要是，不同的接口的成功标识和失败提示是不一致的。
  另外，不同的项目的处理方法也是不一致的，这里出错就是简单的alert
*/

function apiAxios(method, url, params, success) {
    if (params) {
        params = filterNull(params)
    }
    axios({
        method: method,
        url: url,
        data: method === 'POST' || method === 'PUT' ? params : null,
        params: method === 'GET' || method === 'DELETE' ? params : null,　　 //headers 是即将被发送的自定义请求头，还记得我们的jwt验证么，可以封装进来，注意!这里如果要添加 headers ，一定要是正确的值　　 headers:{"Authorization":"Bearer xxxxxxx"},
        // baseURL: root,
        withCredentials: false
    })
        .then(function (res) {
            if (method != 'GET')
                vm.$notify({ type: 'success', message: '操作成功' });
            success(res.data)
            // if (res.data.success === true) {
            //     if (success) {
            //         success(res.data)
            //     }
            // } else {
            //     if (failure) {
            //         failure(res.data)
            //     } else {
            //         window.alert('error: ' + JSON.stringify(res.data))
            //     }
            // }
        })
    // .catch(function (err) {
    //     let res = err.response
    //     // console.log(err)
    //     if (err) {
    //         vm.$notify({ type: 'danger', message: err.statusText });
    //         // window.alert('api error, HTTP CODE: ' + res.statusText)
    //     }
    // })
}

function apiUploadAxios(method, url, params, success) {
    // if (params) {
    //     params = filterNull(params)
    // }
    axios({
        method: method,
        url: url,
        data: method === 'POST' || method === 'PUT' ? params : null,
        params: method === 'GET' || method === 'DELETE' ? params : null,　　 //headers 是即将被发送的自定义请求头，还记得我们的jwt验证么，可以封装进来，注意!这里如果要添加 headers ，一定要是正确的值　　 headers:{"Authorization":"Bearer xxxxxxx"},
        // baseURL: root,
        withCredentials: false,
        headers: { "Content-Type": "multipart/form-data" }
    })
        .then(function (res) {
            success(res.data)
            if (method != 'GET')
                vm.$notify({ type: 'success', message: '操作成功' });
        })
    // .catch(function (err) {
    //     let res = err.response
    //     alert(JSON.stringify(err))
    //     if (err) {
    //         vm.$notify({ type: 'danger', message: res.statusText });
    //     }
    // })
}

// 返回在vue模板中的调用接口
export default {
    get: function (baseUrl, url, params, success) {
        return apiAxios('GET', baseURL[baseUrl] + url, params, success)
    },
    post: function (baseUrl, url, params, success) {
        return apiAxios('POST', baseURL[baseUrl] + url, params, success)
    },
    put: function (baseUrl, url, params, success) {
        return apiAxios('PUT', baseURL[baseUrl] + url, params, success)
    },
    delete: function (baseUrl, url, params, success) {
        return apiAxios('DELETE', baseURL[baseUrl] + url, params, success)
    },
    upload: function (baseUrl, url, params, success) {
        return apiUploadAxios('POST', baseURL[baseUrl] + url, params, success)
    },
    axios: axios,
    baseURL: baseURL
}